#include <iostream>
#include <string>
using namespace std;

//long long a, h, b, k;
//
//int main() {
//    cin >> a >> h >> b >> k;
//    long long sum = 0;
//    while (1)
//    {
//        sum += b;
//        sum += a;
//        h -= b;
//        k -= a;
//        if (h <= 0 && k <= 0)
//        {
//            break;
//        }
//        else if (h <= 0 && k > 0)
//        {
//            sum += (10 * b);
//            break;
//        }
//        else if (h > 0 && k <= 0)
//        {
//            sum += (10 * a);
//            break;
//        }
//    }
//    cout << sum << endl;
//    return 0;
//}
//
//int main() {
//    cin >> a >> h >> b >> k;
//    long long sum = 0;
//    int n1 = h / b + (h % b == 0 ? 0 : 1);
//    int n2 = k / a + (k % a == 0 ? 0 : 1);
//    if (n1 > n2)
//    {
//        sum += (a * n2 + b * n2 + a * 10);
//    }
//    else if (n1 < n2)
//    {
//        sum += (a * n1 + b * n1 + b * 10);
//    }
//    else if (n1 == n2)
//    {
//        sum += (a * n2 + b * n2);
//    }
//    cout << sum << endl;
//    return 0;
//}
//
//int symmetry(string& s, int left, int right, int n)
//{
//    int sum = 0;
//    int k = 0;
//    while (left >= 0 && right < n)
//    {
//        if (s[left] != s[right])
//        {
//            k = 1;
//        }
//        sum += 2;
//        left--;
//        right++;
//    }
//    if (k)
//    {
//        return sum;
//    }
//    return 0;
//}
//
//int main() {
//    string s;
//    cin >> s;
//    int n = s.size();
//    int ret = 0;
//    for (int i = 0; i < n; i++)
//    {
//        ret = max(max(symmetry(s, i, i + 1, n), symmetry(s, i - 1, i + 1, n) + 1), ret);
//    }
//    cout << ret << endl;
//    return 0;
//}
//
//int main() {
//    int n;
//    cin >> n;
//    int arr[n + 1];
//    for (int i = 1; i <= n; i++)
//    {
//        cin >> arr[i];
//    }
//    int board[100010];
//    long long ret = INT_MIN;
//    for (int i = 1; i <= n; i++)
//    {
//        board[i] = max(board[i - 1], 0) + arr[i];
//        ret = max(ret, (long long)board[i]);
//    }
//    cout << ret << endl;
//    return 0;
//}
//
//int dp[1001][1001] = { 0 };
//
//int main() {
//    int arr[255] = { 0 };
//    string str;
//    getline(cin, str);
//    int n = str.size();
//    for (int i = n - 1; i >= 0; i--)
//    {
//        dp[i][i] = 1;
//        for (int j = i + 1; j < n; j++)
//        {
//            if (str[i] == str[j])
//            {
//                dp[i][j] = dp[i + 1][j - 1] + 2;
//            }
//            else
//            {
//                dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
//            }
//        }
//    }
//    cout << dp[0][n - 1] << endl;
//    return 0;
//}
//
//int main() {
//    int n;
//    cin >> n;
//    int l = 1;
//    int r = n;
//    while (l <= r)
//    {
//        if (l == r)
//        {
//            cout << l;
//            break;
//        }
//        cout << l << " ";
//        cout << r << " ";
//        l++;
//        r--;
//    }
//    return 0;
//}
//
//class Solution {
//public:
//    int longestPalindromeSubSeq(string s) {
//        int dp[1010][1010] = { 0 };
//        int n = s.size();
//        for (int i = n - 1; i >= 0; i--)
//        {
//            dp[i][i] = 1;
//            for (int j = i + 1; j < n; j++)
//            {
//                if (s[i] == s[j])
//                {
//                    dp[i][j] = dp[i + 1][j - 1] + 2;
//                }
//                else
//                {
//                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
//                }
//            }
//        }
//        return dp[0][n - 1];
//    }
//};

class Solution {
public:
    bool dp[205][205]={0};
    int n1;
    int n2;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int ret=0;
    queue<pair<int,int>> q;

    void dps(int x,int y,vector<vector<int> >& m)
    {
        dp[x][y]=true;
        for(int i=0;i<4;i++)
        {
            int x1=x+dx[i];
            int y1=dy[i]+y;
            if(x1>=0&&x1<n1&&y1>=0&&y1<n2&&!dp[x1][y1]&&m[x][y]==1)
            {
                dps(x1,y1,m);
            }
        }
    }

    int citys(vector<vector<int> >& m) {
        // write code here
        int n1=m.size();
        int n2=m[0].size();
        

        for(int i=0;i<n1;i++)
        {
            for(int j=0;j<n2;j++)
            {
                if(m[i][j]==1)
                {
                    q.push({i,j});
                }
            }
        }

        while(q.size())
        {
            auto [x,y]=q.front();
            q.pop();
            if(!dp[x][y])
            {
                ret++;
                dps(x, y ,m);
            }
        }
        return ret;
    }
};